function SerialMonitor
% 基于MATLAB的串口实时数据监控系统
% 通过串口实时读取电压、电流和设备状态数据，并在GUI界面中以图形方式显示

% 关闭所有图形窗口
close all;
% 清除所有变量
clear all;
% 清除命令窗口
clc;

% 创建图形界面
fig = figure('Name', '电磁锁异常检测系统', ...
    'Position', [100, 100, 1000, 700], ... % 增加高度以容纳标题
    'NumberTitle', 'off', ...
    'MenuBar', 'none', ...
    'Color', [0.15, 0.15, 0.2], ... % 深色背景
    'Resize', 'on');

% 添加主标题
annotation('textbox', [0.3, 0.94, 0.4, 0.05], ...
    'String', '电磁锁异常检测', ...
    'FontSize', 16, ...
    'FontWeight', 'bold', ...
    'EdgeColor', 'none', ...
    'Color', [0.4, 0.7, 1], ... % 亮蓝色标题
    'HorizontalAlignment', 'center');

% 创建三个子图
voltageAxes = subplot(3, 1, 1);
title('电压实时监测', 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.4, 0.7, 1]);
xlabel('时间 (s)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
ylabel('电压 (V)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
grid on;
set(voltageAxes, 'Color', [0.2, 0.2, 0.25], 'GridColor', [0.3, 0.3, 0.4], ...
    'XColor', [0.7, 0.7, 0.8], 'YColor', [0.7, 0.7, 0.8]);
hold on;
box on; % 添加边框

currentAxes = subplot(3, 1, 2);
title('电流实时监测', 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.4, 0.7, 1]);
xlabel('时间 (s)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
ylabel('电流 (mA)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
grid on;
set(currentAxes, 'Color', [0.2, 0.2, 0.25], 'GridColor', [0.3, 0.3, 0.4], ...
    'XColor', [0.7, 0.7, 0.8], 'YColor', [0.7, 0.7, 0.8]);
hold on;
box on; % 添加边框

statusAxes = subplot(3, 1, 3);
title('设备状态监测', 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.4, 0.7, 1]);
xlabel('时间 (s)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
ylabel('状态', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
ylim([-0.5, 1.5]);
yticks([0, 1]);
yticklabels({'异常', '正常'});
grid on;
set(statusAxes, 'Color', [0.2, 0.2, 0.25], 'GridColor', [0.3, 0.3, 0.4], ...
    'XColor', [0.7, 0.7, 0.8], 'YColor', [0.7, 0.7, 0.8]);
hold on;
box on; % 添加边框

% 添加初始状态文本（未启动）
statusTextHandle = text(0.5, 0.5, '未启动', 'Parent', statusAxes, ...
    'FontSize', 24, 'FontWeight', 'bold', 'Color', [0.6, 0.6, 0.7], ...
    'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle');
set(statusAxes, 'XTick', [], 'YTick', []); % 隐藏坐标轴刻度

% 创建控制面板
controlPanel = uipanel('Title', '控制面板', ...
    'Position', [0.01, 0.01, 0.98, 0.15], ...
    'FontSize', 10, ...
    'FontWeight', 'bold', ...
    'ForegroundColor', [0.4, 0.7, 1], ... % 亮蓝色标题
    'BackgroundColor', [0.25, 0.25, 0.3]); % 深色背景

% 获取可用串口列表
try
    % 尝试使用新的 serialportlist 函数（适用于较新版本的 MATLAB）
    availablePorts = serialportlist("available");
    if isempty(availablePorts)
        availablePorts = {'无可用串口'};
    end
catch
    % 如果 serialportlist 不可用，则使用旧的 instrhwinfo 函数
    warning('off', 'MATLAB:instrhwinfo:FunctionToBeRemoved');
    serialInfo = instrhwinfo('serial');
    availablePorts = serialInfo.SerialPorts;
    if isempty(availablePorts)
        availablePorts = {'无可用串口'};
    end
    warning('on', 'MATLAB:instrhwinfo:FunctionToBeRemoved');
end

% 创建串口选择下拉菜单
uicontrol('Parent', controlPanel, ...
    'Style', 'text', ...
    'String', '串口选择:', ...
    'Position', [20, 50, 80, 20], ...
    'BackgroundColor', [0.25, 0.25, 0.3], ...
    'ForegroundColor', [0.9, 0.9, 1]);

portSelector = uicontrol('Parent', controlPanel, ...
    'Style', 'popupmenu', ...
    'String', availablePorts, ...
    'Position', [100, 50, 100, 20], ...
    'BackgroundColor', [0.3, 0.3, 0.35], ...
    'ForegroundColor', [0.9, 0.9, 1]);

% 创建波特率选择下拉菜单
uicontrol('Parent', controlPanel, ...
    'Style', 'text', ...
    'String', '波特率:', ...
    'Position', [220, 50, 80, 20], ...
    'BackgroundColor', [0.25, 0.25, 0.3], ...
    'ForegroundColor', [0.9, 0.9, 1]);

baudSelector = uicontrol('Parent', controlPanel, ...
    'Style', 'popupmenu', ...
    'String', {'9600', '19200', '38400', '57600', '115200'}, ...
    'Value', 5, ... % 默认选择115200
    'Position', [300, 50, 100, 20], ...
    'BackgroundColor', [0.3, 0.3, 0.35], ...
    'ForegroundColor', [0.9, 0.9, 1]);

% 创建开始按钮
startButton = uicontrol('Parent', controlPanel, ...
    'Style', 'pushbutton', ...
    'String', '开始监控', ...
    'Position', [420, 50, 100, 30], ...
    'BackgroundColor', [0.2, 0.6, 0.4], ... % 绿色按钮
    'ForegroundColor', [1, 1, 1], ... % 白色文字
    'FontWeight', 'bold', ...
    'Callback', @startCallback);

% 创建停止按钮
stopButton = uicontrol('Parent', controlPanel, ...
    'Style', 'pushbutton', ...
    'String', '停止监控', ...
    'Position', [540, 50, 100, 30], ...
    'BackgroundColor', [0.7, 0.3, 0.3], ... % 红色按钮
    'ForegroundColor', [1, 1, 1], ... % 白色文字
    'FontWeight', 'bold', ...
    'Enable', 'off', ...
    'Callback', @stopCallback);

% 创建清除按钮
clearButton = uicontrol('Parent', controlPanel, ...
    'Style', 'pushbutton', ...
    'String', '清除数据', ...
    'Position', [660, 50, 100, 30], ...
    'BackgroundColor', [0.3, 0.5, 0.7], ... % 蓝色按钮
    'ForegroundColor', [1, 1, 1], ... % 白色文字
    'FontWeight', 'bold', ...
    'Callback', @clearCallback);

% 创建状态显示文本
statusText = uicontrol('Parent', controlPanel, ...
    'Style', 'text', ...
    'String', '状态: 未连接', ...
    'Position', [780, 50, 150, 20], ...
    'BackgroundColor', [0.25, 0.25, 0.3], ...
    'ForegroundColor', [0.9, 0.9, 1], ...
    'HorizontalAlignment', 'left');

% 创建数据存储变量
data.time = [];
data.voltage = [];
data.current = [];
data.status = [];
data.serialObj = [];
data.timer = [];
data.isRunning = false;
data.startTime = 0;

% 将数据存储在figure的UserData中
set(fig, 'UserData', data);

% 开始监控回调函数
function startCallback(~, ~)
    data = get(fig, 'UserData');
    
    if data.isRunning
        return;
    end
    
    % 获取选择的串口和波特率
    ports = get(portSelector, 'String');
    portIndex = get(portSelector, 'Value');
    
    % 根据ports类型选择正确的索引方式
    if iscell(ports)
        selectedPort = ports{portIndex};
    else
        % 如果是字符串数组，使用()索引
        selectedPort = ports(portIndex);
    end
    
    baudRates = get(baudSelector, 'String');
    selectedBaudRate = str2double(baudRates{get(baudSelector, 'Value')});
    
    % 检查是否有可用串口
    if strcmp(selectedPort, '无可用串口')
        set(statusText, 'String', '状态: 无可用串口');
        return;
    end
    
    % 更新UI状态
    set(startButton, 'Enable', 'off');
    set(stopButton, 'Enable', 'on');
    set(portSelector, 'Enable', 'off');
    set(baudSelector, 'Enable', 'off');
    
    % 开始监控
    % 开始监控回调函数中的串口创建部分

    try
    % 创建串口对象
    serialObj = serial(selectedPort, 'BaudRate', selectedBaudRate, ...
    'InputBufferSize', 4096, ... % 增加输入缓冲区大小
    'Timeout', 1); % 设置超时时间
    fopen(serialObj);
    set(statusText, 'String', ['状态: 已连接到 ' char(selectedPort)]);
    
    % 清空缓冲区中可能存在的旧数据
    if get(serialObj, 'BytesAvailable') > 0
        fread(serialObj, get(serialObj, 'BytesAvailable'));
    end
    
    % 更新数据
    data.serialObj = serialObj;
    data.startTime = tic;
    data.isRunning = true;
    set(fig, 'UserData', data);
    
    % 创建定时器对象
    timerObj = timer('ExecutionMode', 'fixedRate', ...
    'Period', 0.2, ... % 降低更新频率到5Hz，减少数据处理压力
    'TimerFcn', @(~, ~) updateData());
        
        % 保存定时器对象
        data.timer = timerObj;
        set(fig, 'UserData', data);
        
        % 启动定时器
        start(timerObj);
        
    catch e
        set(statusText, 'String', ['状态: 连接失败 - ' e.message]);
        
        % 恢复UI状态
        set(startButton, 'Enable', 'on');
        set(stopButton, 'Enable', 'off');
        set(portSelector, 'Enable', 'on');
        set(baudSelector, 'Enable', 'on');
    end
end

% 更新数据函数
% 更新数据函数
function updateData()
    data = get(fig, 'UserData');
    serialObj = data.serialObj;
    
    % 检查串口是否可用
    if ~isvalid(serialObj)
        set(statusText, 'String', '状态: 串口连接已断开');
        return;
    end
    
    % 检查串口是否有数据可读
    bytesAvailable = get(serialObj, 'BytesAvailable');
    if bytesAvailable > 0
        try
            % 读取串口数据
            rawData = fread(serialObj, bytesAvailable, 'uint8');
            rawData = char(rawData');
            
            % 解析数据 (格式为 "T:x V:xxxx A:yyyy")
            % 查找所有电压、电流和闭合状态值
            voltageMatches = regexp(rawData, 'V:(\d+)', 'tokens');
            currentMatches = regexp(rawData, 'A:(\d+)', 'tokens');
            lockMatches = regexp(rawData, 'T:(\d+)', 'tokens');
            
            % 确保找到了匹配的数据
            if ~isempty(voltageMatches) && ~isempty(currentMatches) && ...
               length(voltageMatches) >= 1 && length(currentMatches) >= 1
                
                % 获取最后一组电压和电流值
                voltage = str2double(voltageMatches{end}{1}) / 100; % 除以100转换为伏特
                current = str2double(currentMatches{end}{1}); % 保持为毫安
                
                % 获取电磁锁闭合状态（如果有）
                if ~isempty(lockMatches) && length(lockMatches) >= 1
                    lockState = str2double(lockMatches{end}{1}); % 0为打开，1为关闭
                    
                    % 初始化锁状态字段（如果不存在）
                    if ~isfield(data, 'lockState')
                        data.lockState = [];
                    end
                    
                    % 更新锁状态数据
                    data.lockState(end+1) = lockState;
                else
                    % 如果没有找到锁状态数据，默认为未知状态(-1)
                    if ~isfield(data, 'lockState')
                        data.lockState = [];
                    end
                    data.lockState(end+1) = -1;
                end
                
                % 获取当前时间
                currentTime = toc(data.startTime);
                
                % 初始化通电开始时间字段（如果不存在）
                if ~isfield(data, 'powerOnTime')
                    data.powerOnTime = -1; % -1表示未通电
                end
                
                % 初始化上一次状态字段（如果不存在）
                if ~isfield(data, 'lastStatus')
                    data.lastStatus = 2; % 默认为未启动状态
                end
                
                % 初始化上一次电压字段（如果不存在）
                if ~isfield(data, 'lastVoltage')
                    data.lastVoltage = 0;
                end
                
                % 判断设备状态
                % 1. 检查是否为未启动状态（电压<1V且电流<50mA）
                if voltage < 1 && current < 50
                    status = 2; % 未启动状态
                    data.powerOnTime = -1; % 重置通电时间
                else
                    % 2. 检查是否为锁闭合异常状态（电压>11V且锁闭合T=1）
                    if voltage > 11 && isfield(data, 'lockState') && ~isempty(data.lockState) && data.lockState(end) == 1
                        status = 0; % 异常
                        % 可以添加一个特殊标记表示这是锁闭合异常
                        if ~isfield(data, 'errorType')
                            data.errorType = [];
                        end
                        data.errorType(end+1) = 1; % 1表示锁闭合异常
                    else
                        % 如果不是锁闭合异常，记录普通异常类型
                        if ~isfield(data, 'errorType')
                            data.errorType = [];
                        end
                        data.errorType(end+1) = 0; % 0表示普通异常或正常
                        
                        % 3. 检查是否从未启动状态变为通电状态，或从低电压变为高电压
                        % 修改：改进通电开始时间的记录逻辑
                        if (data.lastStatus == 2 && voltage > 10) || (data.lastVoltage <= 10 && voltage > 10)
                            % 记录通电开始时间
                            data.powerOnTime = currentTime;
                            % 添加调试信息
                            disp(['通电开始: 时间=' num2str(currentTime) ', 电压=' num2str(voltage)]);
                        end
                        
                        % 5. 检查是否为高电压异常（电压>10V且单次通电时间超过6秒）
                        % 修改：降低电压阈值，保持时间阈值为6秒
                        if voltage > 10 && data.powerOnTime > 0
                            % 计算通电持续时间
                            powerOnDuration = currentTime - data.powerOnTime;
                            
                            % 添加调试信息
                            disp(['高电压检测: 持续时间=' num2str(powerOnDuration) '秒, 电压=' num2str(voltage)]);
                            
                            if powerOnDuration > 5
                                status = 0; % 异常
                                % 添加特殊标记表示这是通电时间过长异常
                                if ~isfield(data, 'errorType')
                                    data.errorType = [];
                                end
                                data.errorType(end) = 2; % 2表示通电时间过长异常
                                % 添加调试信息
                                disp('检测到高电压异常!');
                            else
                                status = 1; % 暂时正常
                            end
                        else
                            % 6. 其他情况根据原有逻辑判断
                            if voltage < 10 || current < 800
                                status = 0; % 异常
                            else
                                status = 1; % 正常
                            end
                        end
                    end
                end
                
                % 保存当前状态和电压作为下一次的参考
                data.lastStatus = status;
                data.lastVoltage = voltage;
                
                % 更新数据数组
                data.time(end+1) = currentTime;
                data.voltage(end+1) = voltage;
                data.current(end+1) = current;
                data.status(end+1) = status;
                
                % 只保留最近10秒的数据
                timeWindow = 10; % 10秒时间窗口
                if ~isempty(data.time) && currentTime > timeWindow
                    idx = data.time > (currentTime - timeWindow);
                    data.time = data.time(idx);
                    data.voltage = data.voltage(idx);
                    data.current = data.current(idx);
                    data.status = data.status(idx);
                    if isfield(data, 'lockState')
                        data.lockState = data.lockState(idx);
                    end
                end
                
                % 保存更新后的数据
                set(fig, 'UserData', data);
                
                % 更新电压图
                cla(voltageAxes);
                plot(voltageAxes, data.time, data.voltage, 'Color', [1, 0.5, 0.3], 'LineWidth', 2.5); % 橙色线条
                if ~isempty(data.time)
                    xlim(voltageAxes, [max(0, currentTime-timeWindow), max(timeWindow, currentTime)]);
                end
                
                % 更新电流图
                cla(currentAxes);
                plot(currentAxes, data.time, data.current, 'Color', [0.4, 0.8, 1], 'LineWidth', 2.5); % 亮蓝色线条
                if ~isempty(data.time)
                    xlim(currentAxes, [max(0, currentTime-timeWindow), max(timeWindow, currentTime)]);
                end
                
                % 更新状态图
                if ~isempty(data.status) && ~isempty(data.time)
                    % 清除当前图形
                    cla(statusAxes);
                    
                    % 删除之前的状态文本
                    if isfield(data, 'statusTextHandle') && ishandle(data.statusTextHandle)
                        delete(data.statusTextHandle);
                    end
                    
                    % 获取最新状态
                    latestStatus = data.status(end);
                    latestLockState = data.lockState(end);
                    
                    % 检查是否为锁闭合异常
                    isLockClosedError = false;
                    isPowerOnTooLongError = false;
                    if isfield(data, 'errorType') && ~isempty(data.errorType)
                        isLockClosedError = (data.errorType(end) == 1);
                        isPowerOnTooLongError = (data.errorType(end) == 2);
                    end
                    
                    % 根据状态显示大字体文本
                    if latestStatus == 1
                        statusStr = '正常';
                        statusColor = [0.3, 0.9, 0.5]; % 亮绿色
                    elseif latestStatus == 2
                        statusStr = '未启动';
                        statusColor = [0.6, 0.6, 0.7]; % 灰色
                    else
                        if isLockClosedError
                            statusStr = '锁闭合异常';
                        elseif isPowerOnTooLongError
                            statusStr = '异常：通电时间过长';
                        else
                            statusStr = '异常';
                        end
                        statusColor = [1, 0.4, 0.4]; % 亮红色
                    end
                    
                    % 添加锁状态信息（如果不是锁闭合异常且不是通电时间过长异常）
                    if ~isLockClosedError && ~isPowerOnTooLongError
                        if latestLockState == 1
                            lockStr = '锁闭合';
                        elseif latestLockState == 0
                            lockStr = '锁打开';
                        else
                            lockStr = '';
                        end
                        
                        % 如果有锁状态，添加到状态文本中
                        if ~isempty(lockStr)
                            statusStr = [statusStr ' - ' lockStr];
                        end
                    end
                    
                    % 创建大字体状态文本
                    data.statusTextHandle = text(0.5, 0.5, statusStr, 'Parent', statusAxes, ...
                        'FontSize', 36, 'FontWeight', 'bold', 'Color', statusColor, ...
                        'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle');
                    
                    % 绘制正常状态点（绿色）
                    if any(normalIdx)
                        plot(statusAxes, data.time(normalIdx), ones(1, sum(normalIdx))*0.5, 'o', ...
                            'Color', [0.3, 0.9, 0.5], 'MarkerFaceColor', [0.3, 0.9, 0.5], 'MarkerSize', 4);
                    end
                    
                    % 绘制异常状态点（红色）
                    if any(abnormalIdx)
                        plot(statusAxes, data.time(abnormalIdx), zeros(1, sum(abnormalIdx)), 'o', ...
                            'Color', [1, 0.4, 0.4], 'MarkerFaceColor', [1, 0.4, 0.4], 'MarkerSize', 4);
                    end
                    
                    % 绘制未启动状态点（灰色）
                    if any(notStartedIdx)
                        plot(statusAxes, data.time(notStartedIdx), ones(1, sum(notStartedIdx))*0.25, 'o', ...
                            'Color', [0.6, 0.6, 0.7], 'MarkerFaceColor', [0.6, 0.6, 0.7], 'MarkerSize', 4);
                    end
                    
                    % 绘制锁闭合状态点（黄色）
                    lockClosedIdx = data.lockState == 1;
                    if any(lockClosedIdx)
                        plot(statusAxes, data.time(lockClosedIdx), ones(1, sum(lockClosedIdx))*0.75, 'o', ...
                            'Color', [1, 0.8, 0.2], 'MarkerFaceColor', [1, 0.8, 0.2], 'MarkerSize', 4);
                    end
                    
                    % 绘制锁打开状态点（青色）
                    lockOpenIdx = data.lockState == 0;
                    if any(lockOpenIdx)
                        plot(statusAxes, data.time(lockOpenIdx), ones(1, sum(lockOpenIdx))*0.75, 'o', ...
                            'Color', [0.2, 0.9, 0.9], 'MarkerFaceColor', [0.2, 0.9, 0.9], 'MarkerSize', 4);
                    end
                    
                    % 重新设置坐标轴
                    hold(statusAxes, 'on');
                    grid(statusAxes, 'on');
                    box(statusAxes, 'on');
                    ylim(statusAxes, [-0.5, 1.5]);
                    set(statusAxes, 'XTick', [], 'YTick', []); % 隐藏坐标轴刻度
                    
                    if ~isempty(data.time)
                        xlim(statusAxes, [max(0, currentTime-timeWindow), max(timeWindow, currentTime)]);
                    end
                    
                    % 保存更新后的数据
                    set(fig, 'UserData', data);
                end
                
                % 更新状态文本
                % 更新状态文本
                if latestStatus == 1
                    statusStr = '正常';
                    statusColor = [0, 0.7, 0]; % 绿色
                elseif latestStatus == 2
                    statusStr = '未启动';
                    statusColor = [0.5, 0.5, 0.5]; % 灰色
                else
                    if isLockClosedError
                        statusStr = '锁闭合异常';
                    elseif isPowerOnTooLongError
                        statusStr = '异常：通电时间过长';
                    else
                        statusStr = '异常';
                    end
                    statusColor = [0.8, 0, 0]; % 红色
                end
                
                % 添加锁状态到状态文本（如果不是锁闭合异常且不是通电时间过长异常）
                if ~isLockClosedError && ~isPowerOnTooLongError && isfield(data, 'lockState') && ~isempty(data.lockState)
                    latestLockState = data.lockState(end);
                    if latestLockState == 1
                        lockStr = ' - 锁闭合';
                    elseif latestLockState == 0
                        lockStr = ' - 锁打开';
                    else
                        lockStr = '';
                    end
                    statusStr = [statusStr lockStr];
                end
                
                set(statusText, 'String', ['状态: 已连接 - 设备' statusStr], 'ForegroundColor', statusColor);
            end
        catch e
            disp(['数据解析错误: ' e.message]);
        end
    end
end

% 停止监控回调函数
function stopCallback(~, ~)
    data = get(fig, 'UserData');
    
    if ~data.isRunning
        return;
    end
    
    % 停止监控
    stopMonitoring();
    
    % 更新UI状态
    set(startButton, 'Enable', 'on');
    set(stopButton, 'Enable', 'off');
    set(portSelector, 'Enable', 'on');
    set(baudSelector, 'Enable', 'on');
    
    % 更新数据
    data.isRunning = false;
    set(fig, 'UserData', data);
end

% 停止监控函数
function stopMonitoring()
    data = get(fig, 'UserData');
    
    % 停止定时器
    if ~isempty(data.timer) && isvalid(data.timer)
        stop(data.timer);
        delete(data.timer);
        data.timer = [];
    end
    
    % 关闭串口
    if ~isempty(data.serialObj) && isvalid(data.serialObj)
        fclose(data.serialObj);
        delete(data.serialObj);
        data.serialObj = [];
    end
    
    % 更新状态文本
    set(statusText, 'String', '状态: 已断开连接', 'ForegroundColor', [0, 0, 0]);
    
    % 更新数据
    set(fig, 'UserData', data);
end

% 清除数据回调函数
function clearCallback(~, ~)
    % 清除图形
    cla(voltageAxes);
    cla(currentAxes);
    cla(statusAxes);
    
    % 重置坐标轴
    title(voltageAxes, '电压实时监测', 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.4, 0.7, 1]);
    xlabel(voltageAxes, '时间 (s)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
    ylabel(voltageAxes, '电压 (V)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
    grid(voltageAxes, 'on');
    box(voltageAxes, 'on');
    set(voltageAxes, 'Color', [0.2, 0.2, 0.25], 'GridColor', [0.3, 0.3, 0.4], ...
        'XColor', [0.7, 0.7, 0.8], 'YColor', [0.7, 0.7, 0.8]);
    
    title(currentAxes, '电流实时监测', 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.4, 0.7, 1]);
    xlabel(currentAxes, '时间 (s)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
    ylabel(currentAxes, '电流 (mA)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
    grid(currentAxes, 'on');
    box(currentAxes, 'on');
    set(currentAxes, 'Color', [0.2, 0.2, 0.25], 'GridColor', [0.3, 0.3, 0.4], ...
        'XColor', [0.7, 0.7, 0.8], 'YColor', [0.7, 0.7, 0.8]);
    
    title(statusAxes, '设备状态监测', 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.4, 0.7, 1]);
    xlabel(statusAxes, '时间 (s)', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
    ylabel(statusAxes, '状态', 'FontSize', 10, 'Color', [0.8, 0.8, 0.9]);
    set(statusAxes, 'XTick', [], 'YTick', []); % 隐藏坐标轴刻度
    grid(statusAxes, 'on');
    box(statusAxes, 'on');
    set(statusAxes, 'Color', [0.2, 0.2, 0.25], 'GridColor', [0.3, 0.3, 0.4], ...
        'XColor', [0.7, 0.7, 0.8], 'YColor', [0.7, 0.7, 0.8]);
    
    % 添加系统启动状态文本
    data = get(fig, 'UserData');
    if isfield(data, 'statusTextHandle') && ishandle(data.statusTextHandle)
        delete(data.statusTextHandle);
    end
    data.statusTextHandle = text(0.5, 0.5, '系统启动', 'Parent', statusAxes, ...
        'FontSize', 36, 'FontWeight', 'bold', 'Color', [0.5, 0.7, 1], ... % 亮蓝色
        'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle');
    
    % 清除数据
    data.time = [];
    data.voltage = [];
    data.current = [];
    data.status = [];
    set(fig, 'UserData', data);
end

% 关闭图形窗口时的回调函数
set(fig, 'CloseRequestFcn', @closeFigure);

function closeFigure(~, ~)
    data = get(fig, 'UserData');
    
    % 如果正在运行，停止监控
    if data.isRunning
        stopMonitoring();
    end
    
    % 删除图形窗口
    delete(fig);
end

end